/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package be.vdab.util;

import java.io.Serializable;

/**
 *
 * @author Joris
 */
public final class Volume implements Comparable,Serializable {
    private final int hoogte, breedte, diepte;
    private final Maat maat;
    
    public Volume(int hoogte, int breedte, int diepte, Maat maat) throws VolumeException {
        if (hoogte < 0 | breedte < 0 | diepte < 0){
            throw new VolumeException("Negative input");
        } else {
            this.hoogte = hoogte;
            this.breedte = breedte;
            this.diepte = diepte;
        }
        this.maat = maat;
    }

    public int getHoogte() {
        return this.hoogte;
    }

    public int getBreedte() {
        return this.breedte;
    }

    public int getDiepte() {
        return this.diepte;
    }

    public Maat getMaat() {
        return this.maat;
    }
    
    public long getVolume(){
        return getHoogte() * getBreedte() * getDiepte() * (long) Math.pow(getMaat().getValue(),3);
    }
    
    @Override
    public final String toString(){
        return String.format("%s %s %s %s %s %s %s",getHoogte(), "(h)x", getBreedte(), "(b)x", getDiepte(), "(d)", getMaat().name());
    }
    
       
    @Override
    public int hashCode(){
       return this.toString().hashCode();
    }
    
    @Override
    public boolean equals(Object o){
         if (o == null)
            return false;
         else
            if (o instanceof Volume){
                Volume v = (Volume) o;
                if (getHoogte() == v.getHoogte() & getBreedte() == v.getBreedte() & getDiepte() == v.getDiepte() & getMaat() == v.getMaat())
                   return true;
                else
                   return false;
            }
            else
               return false;

    }
    
    @Override 
    public int compareTo(Object o){
        if (o == null)
            throw new NullPointerException();
        else {
            Volume v = (Volume) o;
            if (getVolume() > v.getVolume())
                return 1;
            else {
                if (getVolume() < v.getVolume())
                    return -1;
                else 
                    return 0;
            }
        }
    }
    
   

}
